package h0804;

import java.util.Arrays;
import java.util.Scanner;

/**
  * @description 5G网络建设
  * @author 不知名帅哥
  * @date 2024/8/4 23:36
  * @version 1.0
*/

//kruskal算法
public class FiveGNetworkConstruction2 {
    static class Edge{
        int from; //边起点
        int to; //边终点
        int weight; //权重

        public Edge(int from, int to, int weight) {
            this.from = from;
            this.to = to;
            this.weight = weight;
        }
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n = sc.nextInt();  //基站数量 （节点数）
        int m=sc.nextInt();  //基站对数量（边数）

        Edge[] edges=new Edge[m];

        for (int i = 0; i < m; i++) {
            int x=sc.nextInt();
            int y=sc.nextInt();
            int z=sc.nextInt();
            int p=sc.nextInt();

            //如果p==1，可以认为边权重为0
            edges[i]=new Edge(x,y,p==0?z:0);

        }
        System.out.println(kruskal(edges,n));
    }

    private static int kruskal(Edge[] edges, int n) {
        int minWeight=0;

        //按照边权升序
        Arrays.sort(edges,(a,b)->a.weight-b.weight);

        UnionFindSet set=new UnionFindSet(n+1);

        //最先遍历出来的是边权最小的边
        for (Edge edge : edges) {
            //如果edge.from和edge.to在同一个连通分量里面，会产生环。
            //只有当edge.from和edge.to节点不在同一个连通分量时，才能合并。
            if (set.find(edge.from)!= set.find(edge.to)){
                minWeight+= edge.weight;
                set.union(edge.from, edge.to); //合并，加入到最小生成树中。
            }

            //如果最终形成两个集合，0索引独占一个集合，然后是最小生成树。那么返回
            if (set.count==2){
                return minWeight;
            }
        }

        return -1;
    }
    // 并查集
    static class UnionFindSet {
        int[] fa;
        int count;

        public UnionFindSet(int n) {
            this.fa = new int[n];
            this.count = n;
            for (int i = 0; i < n; i++) this.fa[i] = i;
        }

        public int find(int x) {
            if (x != this.fa[x]) {
                return (this.fa[x] = this.find(this.fa[x]));
            }
            return x;
        }

        public void union(int x, int y) {
            int x_fa = this.find(x);
            int y_fa = this.find(y);

            if (x_fa != y_fa) {
                this.fa[y_fa] = x_fa;
                this.count--;
            }
        }
    }
}
